TIP Swift Sample App/AppDelegate.swift (148 lines of code) (raw):

// // AppDelegate.swift // TIP Swift Sample App // // Created on 3/2/17. // Copyright © 2020 Twitter. All rights reserved. // import TwitterImagePipeline import UIKit @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate, TIPImagePipelineObserver, TIPLogger, TIPImageAdditionalCache, TwitterAPIDelegate { // MARK: UIApplicationDelegate variables var window: UIWindow? // MARK: internal variables var imagePipeline: TIPImagePipeline? // MARK: variables needed by @objc @objc var searchCount: UInt = 100 @objc var searchWebP: Bool = false @objc var usePlaceholder: Bool = false @objc private var debugInfoVisible: Bool { get { return TIPImageViewFetchHelper.isDebugInfoVisible } set(visible) { TIPImageViewFetchHelper.isDebugInfoVisible = visible } } // MARK: private variables private var tabBarController: UITabBarController? private var opCount: Int = 0 private var placeholder: UIImage? // MARK: UIApplicationDelegate functions func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { let tipConfig = TIPGlobalConfiguration.sharedInstance() tipConfig.logger = self tipConfig.serializeCGContextAccess = true tipConfig.isClearMemoryCachesOnApplicationBackgroundEnabled = true tipConfig.add(self) let catalogue = TIPImageCodecCatalogue.sharedInstance() catalogue.setCodec(TIPXWebPCodec.init(preservingDefaultCodecsIfPresent: false), forImageType: TIPImageTypeWEBP) self.imagePipeline = TIPImagePipeline(identifier: "Twitter.Example") self.imagePipeline?.additionalCaches = [self] TwitterAPI.sharedInstance().delegate = self let lightBlueColor = UIColor(red: 150.0/255.0, green: 215.0/255.0, blue: 1.0, alpha: 0.0) UISearchBar.appearance().barTintColor = lightBlueColor UISearchBar.appearance().tintColor = UIColor.white UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self]).tintColor = lightBlueColor UINavigationBar.appearance().barTintColor = lightBlueColor UINavigationBar.appearance().tintColor = UIColor.white UINavigationBar.appearance().titleTextAttributes = [.foregroundColor: UIColor.white] UITabBar.appearance().barTintColor = lightBlueColor UITabBar.appearance().tintColor = UIColor.white UISlider.appearance().minimumTrackTintColor = lightBlueColor UISlider.appearance().tintColor = lightBlueColor UIWindow.appearance().tintColor = lightBlueColor self.window = UIWindow.init(frame: UIScreen.main.bounds) let navCont1 = UINavigationController.init(rootViewController: TwitterSearchViewController.init()) navCont1.tabBarItem = UITabBarItem.init(title: "Search", image: UIImage(named: "first"), tag: 1) let navCont2 = UINavigationController.init(rootViewController: SettingsViewController.init()) navCont2.tabBarItem = UITabBarItem.init(title: "Settings", image: UIImage(named: "second"), tag: 2) let navCont3 = UINavigationController.init(rootViewController: InspectorViewController.init()) navCont3.tabBarItem = UITabBarItem.init(title: "Inspector", image: UIImage(named: "first"), tag: 3) self.tabBarController = UITabBarController.init() self.tabBarController?.viewControllers = [ navCont1, navCont2, navCont3 ] self.window?.rootViewController = self.tabBarController self.window?.backgroundColor = UIColor.orange self.window?.makeKeyAndVisible() return true } // MARK: private functions private func incrementNetworkOperations() { if (Thread.isMainThread) { self.incOps() } else { DispatchQueue.main.async { self.incOps() } } } private func decrementNetworkOperations() { if (Thread.isMainThread) { self.decOps() } else { DispatchQueue.main.async { self.decOps() } } } private func incOps() { self.opCount += 1 if (self.opCount > 0) { UIApplication.shared.isNetworkActivityIndicatorVisible = true } } private func decOps() { self.opCount -= 1 if (self.opCount <= 0) { UIApplication.shared.isNetworkActivityIndicatorVisible = false } } // MARK: API Delegate func apiWorkStarted(_ api: TwitterAPI) { self.incrementNetworkOperations() } func apiWorkFinished(_ api: TwitterAPI) { self.decrementNetworkOperations() } // MARK: Observer func tip_imageFetchOperation(_ op: TIPImageFetchOperation, didStartDownloadingImageAt URL: URL) { self.incrementNetworkOperations() } func tip_imageFetchOperation(_ op: TIPImageFetchOperation, didFinishDownloadingImageAt URL: URL, imageType type: String, sizeInBytes byteSize: UInt, dimensions: CGSize, wasResumed: Bool) { self.decrementNetworkOperations() } // MARK: Logger func tip_log(with level: TIPLogLevel, file: String, function: String, line: Int32, message: String) { let levelString: String switch (level) { case .emergency, .alert, .critical, .error: levelString = "ERR" case .warning: levelString = "WRN" case .notice, .information: levelString = "INF" case .debug: levelString = "DBG" @unknown default: fatalError("unknown objc TIPLogLevel enum (\(level))") } print("[\(levelString): \(message)") } // MARK: Additional Cache func tip_retrieveImage(for URL: URL, completion: @escaping TIPImageAdditionalCacheFetchCompletion) { var image: UIImage? let lastPathComponent: String? = URL.lastPathComponent if let scheme = URL.scheme, let host = URL.host, let lastPathComponent = lastPathComponent { if scheme == "placeholder" && host == "placeholder.com" && lastPathComponent == "placeholder.jpg" { if self.placeholder == nil { self.placeholder = UIImage(named: "placeholder.jpg") } image = self.placeholder } } completion(image) } } func APP_DELEGATE() -> AppDelegate { return UIApplication.shared.delegate as! AppDelegate }